/*
 * @Description: 全局权限验证中间件
 * @Author: Junhuang
 * @Date: 2022-02-09 16:13:50
 * @LastEditTime: 2022-04-18 15:11:12
 * @LastEditors: Junhuang
 * @Reference:
 */
'use strict';

module.exports = (option, app) => {
  return async function auth(ctx, next) {
    // 1.获取token
    const { token } = ctx.header;
    if (!token) {
      let url = '';
      if (ctx.request && ctx.request.url) {
        url = ctx.request.url;
      }
      // console.log(ctx.request)
      ctx.throw(400, '您没有权限访问(' + url + ')该接口!');
    }

    // 2. 根据token解密，获取用户信息
    let user = {};
    try {
      user = app.jwt.verify(token, app.config.jwt.secret);
    } catch (err) {
      const fail = err.name === 'TokenExpiredError' ? 'token已过期！请重新生成令牌' : 'Token令牌不正确';
      ctx.throw(400, fail);
    }

    // 3.判断当前用户是否登录
    // 通过是否有属性roles来判断是admin,还是user
    const t = await ctx.service.cache.get('user_' + user.id);
    const at = await ctx.service.cache.get('admin_' + user.id);
    let tokenType = '';
    if (user.hasOwnProperty('roles')) {
      tokenType = 'admin';
    }
    if ((t && t === token && tokenType === '') || (at && at === token && tokenType === 'admin')) {
      // 令牌合格
    } else {
      ctx.throw(401, 'token令牌不合法！');
    }


    // 4.查询数据库该用户是否存在，即看看该用户是否被删除了，或者其状态是否为正常
    if (tokenType === 'admin') {
      user = await app.model.Admin.findByPk(user.id);
    } else {
      user = await app.model.User.findByPk(user.id);
    }

    if (!user) {
      ctx.throw(400, '用户不存在或被禁用！');
    }


    // 5.把user信息挂载到全局ctx上
    if (tokenType === 'admin') {
      ctx.authAdmin = user;
    } else {
      ctx.authUser = user;
    }

    await next();

  };
};
